Add read support for coursepoints to Garmin Training Center format.
authorrobertlipe@gmail.com <robertlipe@gmail.com@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 21 Jan 2012 23:19:34 +0000 (23:19 +0000)
committerrobertlipe@gmail.com <robertlipe@gmail.com@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 21 Jan 2012 23:19:34 +0000 (23:19 +0000)
git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@4146 f51c46e8-681c-474f-0cfe-069cfd0219fb

gpsbabel/gtrnctr.c
gpsbabel/reference/track/course~tcx.gpx
gpsbabel/reference/track/gtrnctr-readcp.gpx [new file with mode: 0644]
gpsbabel/reference/track/gtrnctr-readcp.tcx [new file with mode: 0644]
gpsbabel/testo.d/classic-4.test
gpsbabel/testo.d/gtrnctr.test [new file with mode: 0644]

index f5188279d6b9a5c755683c7abc3e0f77bf595a65..f049c65072c1fe8be31a60a2a3fa5ee81c0b53f5 100644 (file)
@@ -91,9 +91,13 @@ static xg_callback   gtc_trk_alt;
 static xg_callback     gtc_trk_hr;
 static xg_callback     gtc_trk_cad;
 static xg_callback     gtc_trk_pwr;
+static xg_callback     gtc_wpt_crs_s, gtc_wpt_crs_e;
 static xg_callback     gtc_wpt_pnt_s, gtc_wpt_pnt_e;
+static xg_callback     gtc_wpt_ident;
 static xg_callback     gtc_wpt_lat;
 static xg_callback     gtc_wpt_long;
+static xg_callback     gtc_wpt_icon;
+static xg_callback     gtc_wpt_notes;
 
 static xg_tag_mapping gtc_map[] = {
   /* courses tcx v1 & v2 */
@@ -105,9 +109,17 @@ static xg_tag_mapping gtc_map[] = {
   { gtc_trk_lat,  cb_cdata, "/Courses/Course/Track/Trackpoint/Position/LatitudeDegrees" },
   { gtc_trk_long, cb_cdata, "/Courses/Course/Track/Trackpoint/Position/LongitudeDegrees" },
   { gtc_trk_alt,  cb_cdata, "/Courses/Course/Track/Trackpoint/AltitudeMeters" },
-  { gtc_trk_alt,  cb_cdata, "/Courses/Course/Track/Trackpoint/AltitudeMeters" },
   { gtc_trk_hr,   cb_cdata, "/Courses/Course/Track/Trackpoint/HeartRateBpm" },
   { gtc_trk_cad,  cb_cdata, "/Courses/Course/Track/Trackpoint/Cadence" },
+  { gtc_wpt_crs_s,cb_start, "/Courses/Course/CoursePoint" },
+  { gtc_wpt_crs_e,cb_end,   "/Courses/Course/CoursePoint" },
+  { gtc_wpt_ident,cb_cdata, "/Courses/Course/CoursePoint/Name"},
+  { gtc_trk_utc,  cb_cdata, "/Courses/Course/CoursePoint/Time"},
+  { gtc_wpt_lat,  cb_cdata, "/Courses/Course/CoursePoint/Position/LatitudeDegrees"},
+  { gtc_wpt_long, cb_cdata, "/Courses/Course/CoursePoint/Position/LongitudeDegrees"},
+  { gtc_trk_alt,  cb_cdata, "/Courses/Course/CoursePoint/AltitudeMeters" },
+  { gtc_wpt_icon, cb_cdata, "/Courses/Course/CoursePoint/PointType" },
+  { gtc_wpt_notes,cb_cdata, "/Courses/Course/CoursePoint/Notes" },
 
   /* history tcx v2 (activities) */
   { gtc_trk_s,    cb_start, "/Activities/Activity" },
@@ -142,6 +154,7 @@ static xg_tag_mapping gtc_map[] = {
   { gtc_wpt_pnt_e,cb_end, "/Courses/Course/Lap/BeginPosition" },
   { gtc_wpt_lat,  cb_cdata, "/Courses/Course/Lap/BeginPosition/LatitudeDegrees" },
   { gtc_wpt_long, cb_cdata, "/Courses/Course/Lap/BeginPosition/LongitudeDegrees" },
+  { gtc_trk_alt,  cb_cdata, "/Courses/Course/Lap/BeginAltitudeMeters" },
 
   { NULL,      (xg_cb_type)0,         NULL}
 };
@@ -518,16 +531,40 @@ gtc_trk_pwr(const char* args, const char** unused)
   wpt_tmp->power = atof(args);
 }
 
+void
+gtc_wpt_crs_s(const char* unused, const char** attrv)
+{
+  wpt_tmp = waypt_new();
+}
+
+void
+gtc_wpt_crs_e(const char* args, const char** unused)
+{
+  if (wpt_tmp->longitude != 0. && wpt_tmp->latitude != 0.) {
+    waypt_add(wpt_tmp);
+  } else {
+    waypt_free(wpt_tmp);
+  }
+
+  wpt_tmp = NULL;
+}
+
 void
 gtc_wpt_pnt_s(const char* unused, const char** attrv)
 {
   wpt_tmp = waypt_new();
+  lap_ct++;
 }
 
 void
 gtc_wpt_pnt_e(const char* args, const char** unused)
 {
   if (wpt_tmp->longitude != 0. && wpt_tmp->latitude != 0.) {
+    /* Add the begin position of a CourseLap as
+    a waypoint. */
+    char *cbuf;
+    xasprintf(&cbuf, "LAP%03d", lap_ct);
+    wpt_tmp->shortname = cbuf;
     waypt_add(wpt_tmp);
   } else {
     waypt_free(wpt_tmp);
@@ -536,6 +573,14 @@ gtc_wpt_pnt_e(const char* args, const char** unused)
   wpt_tmp = NULL;
 }
 
+void
+gtc_wpt_ident(const char* args, const char** unused)
+{
+  wpt_tmp->shortname = xstrdup(args);
+  /* Set also as notes for compatibility with garmin usb format */
+  wpt_tmp->notes = xstrdup(args);
+}
+
 void
 gtc_wpt_lat(const char* args, const char** unused)
 {
@@ -548,6 +593,19 @@ gtc_wpt_long(const char* args, const char** unused)
   wpt_tmp->longitude = atof(args);
 }
 
+void
+gtc_wpt_icon(const char* args, const char** unused)
+{
+  wpt_tmp->icon_descr = xstrdup(args);
+  wpt_tmp->wpt_flags.icon_descr_is_dynamic = 1;
+}
+
+void
+gtc_wpt_notes(const char* args, const char** unused)
+{
+  wpt_tmp->description = xstrdup(args);
+}
+
 ff_vecs_t gtc_vecs = {
   ff_type_file,
   {
index 5fcf3435e1f1ba6138fd179e13ef36af10b5c896..49de3f3a93ed232a9ea4fcce8eb0ad93ec313864 100644 (file)
@@ -8,9 +8,9 @@
 <time>1970-01-01T00:00:00Z</time>
 <bounds minlat="34.139802000" minlon="-118.957485700" maxlat="34.199616700" maxlon="-118.756231700"/>
 <wpt lat="34.173919900" lon="-118.758800100">
-  <name>WPT001</name>
-  <cmt>WPT001</cmt>
-  <desc>WPT001</desc>
+  <name>LAP001</name>
+  <cmt>LAP001</cmt>
+  <desc>LAP001</desc>
 </wpt>
 <trk>
   <name>ThursRide</name>
diff --git a/gpsbabel/reference/track/gtrnctr-readcp.gpx b/gpsbabel/reference/track/gtrnctr-readcp.gpx
new file mode 100644 (file)
index 0000000..fe6d93f
--- /dev/null
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx
+  version="1.0"
+  creator="GPSBabel - http://www.gpsbabel.org"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns="http://www.topografix.com/GPX/1/0"
+  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+<time>1970-01-01T00:00:00Z</time>
+<bounds minlat="28.389768000" minlon="-16.582199000" maxlat="28.390003000" maxlon="-16.581019000"/>
+<wpt lat="28.389956295" lon="-16.581523418">
+  <name>LAP001</name>
+  <cmt>LAP001</cmt>
+  <desc>LAP001</desc>
+</wpt>
+<wpt lat="28.389956000" lon="-16.581523000">
+  <ele>231.000000</ele>
+  <time>2012-01-04T00:00:00Z</time>
+  <name>Tp Gen</name>
+  <cmt>Not Gen</cmt>
+  <desc>Tp Gen</desc>
+  <sym>Generic</sym>
+</wpt>
+<wpt lat="28.389919000" lon="-16.581369000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:00:42Z</time>
+  <name>Tp Sum</name>
+  <cmt>Not Sum</cmt>
+  <desc>Tp Sum</desc>
+  <sym>Summit</sym>
+</wpt>
+<wpt lat="28.390003000" lon="-16.581287000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:00:57Z</time>
+  <name>Tp Val</name>
+  <cmt>Not Val</cmt>
+  <desc>Tp Val</desc>
+  <sym>Valley</sym>
+</wpt>
+<wpt lat="28.389985000" lon="-16.581202000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:01:07Z</time>
+  <name>Tp Wat</name>
+  <cmt>Not Wat</cmt>
+  <desc>Tp Wat</desc>
+  <sym>Water</sym>
+</wpt>
+<wpt lat="28.390003000" lon="-16.581105000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:01:19Z</time>
+  <name>Tp Foo</name>
+  <cmt>Not Foo</cmt>
+  <desc>Tp Foo</desc>
+  <sym>Food</sym>
+</wpt>
+<wpt lat="28.389994000" lon="-16.581019000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:01:29Z</time>
+  <name>Tp Dan</name>
+  <cmt>Not Dan</cmt>
+  <desc>Tp Dan</desc>
+  <sym>Danger</sym>
+</wpt>
+<wpt lat="28.389900000" lon="-16.581051000">
+  <ele>234.000000</ele>
+  <time>2012-01-04T00:02:06Z</time>
+  <name>Tp Lef</name>
+  <cmt>Not Lef</cmt>
+  <desc>Tp Lef</desc>
+  <sym>Left</sym>
+</wpt>
+<wpt lat="28.389909000" lon="-16.581191000">
+  <ele>233.000000</ele>
+  <time>2012-01-04T00:02:22Z</time>
+  <name>Tp Rig</name>
+  <cmt>Not Rig</cmt>
+  <desc>Tp Rig</desc>
+  <sym>Right</sym>
+</wpt>
+<wpt lat="28.389890000" lon="-16.581309000">
+  <ele>233.000000</ele>
+  <time>2012-01-04T00:02:37Z</time>
+  <name>Tp Str</name>
+  <cmt>Not Str</cmt>
+  <desc>Tp Str</desc>
+  <sym>Straight</sym>
+</wpt>
+<wpt lat="28.389871000" lon="-16.581438000">
+  <ele>233.000000</ele>
+  <time>2012-01-04T00:02:52Z</time>
+  <name>Tp Fir</name>
+  <cmt>Not Fir</cmt>
+  <desc>Tp Fir</desc>
+  <sym>First Aid</sym>
+</wpt>
+<wpt lat="28.389881000" lon="-16.581663000">
+  <ele>230.000000</ele>
+  <time>2012-01-04T00:03:18Z</time>
+  <name>Tp 4th</name>
+  <cmt>Not 4th</cmt>
+  <desc>Tp 4th</desc>
+  <sym>4th Category</sym>
+</wpt>
+<wpt lat="28.389852000" lon="-16.581813000">
+  <ele>228.000000</ele>
+  <time>2012-01-04T00:03:36Z</time>
+  <name>Tp 3th</name>
+  <cmt>Not 3rd</cmt>
+  <desc>Tp 3th</desc>
+  <sym>3rd Category</sym>
+</wpt>
+<wpt lat="28.389815000" lon="-16.581985000">
+  <ele>224.000000</ele>
+  <time>2012-01-04T00:03:57Z</time>
+  <name>Tp 2nd</name>
+  <cmt>Not 2nd</cmt>
+  <desc>Tp 2nd</desc>
+  <sym>2nd Category</sym>
+</wpt>
+<wpt lat="28.389834000" lon="-16.582156000">
+  <ele>224.000000</ele>
+  <time>2012-01-04T00:04:18Z</time>
+  <name>Tp 1st</name>
+  <cmt>Not 1st</cmt>
+  <desc>Tp 1st</desc>
+  <sym>1st Category</sym>
+</wpt>
+<wpt lat="28.389768000" lon="-16.582199000">
+  <ele>226.000000</ele>
+  <time>2012-01-04T00:04:52Z</time>
+  <name>Tp Hor</name>
+  <cmt>Not Hor</cmt>
+  <desc>Tp Hor</desc>
+  <sym>Hors Category</sym>
+</wpt>
+<wpt lat="28.389777000" lon="-16.582049000">
+  <ele>225.000000</ele>
+  <time>2012-01-04T00:05:09Z</time>
+  <name>Tp Spr</name>
+  <cmt>Not Spr</cmt>
+  <desc>Tp Spr</desc>
+  <sym>Sprint</sym>
+</wpt>
+<trk>
+  <name>Test CP Reading</name>
+<trkseg>
+<trkpt lat="28.389956000" lon="-16.581523000">
+  <ele>231.000000</ele>
+  <time>2012-01-04T00:00:00Z</time>
+</trkpt>
+<trkpt lat="28.389950000" lon="-16.581551000">
+  <ele>231.000000</ele>
+  <time>2012-01-04T00:00:04Z</time>
+</trkpt>
+<trkpt lat="28.389900000" lon="-16.581539000">
+  <ele>231.000000</ele>
+  <time>2012-01-04T00:00:14Z</time>
+</trkpt>
+<trkpt lat="28.389919000" lon="-16.581369000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:00:42Z</time>
+</trkpt>
+<trkpt lat="28.390003000" lon="-16.581287000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:00:57Z</time>
+</trkpt>
+<trkpt lat="28.389985000" lon="-16.581202000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:01:07Z</time>
+</trkpt>
+<trkpt lat="28.390003000" lon="-16.581105000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:01:19Z</time>
+</trkpt>
+<trkpt lat="28.389994000" lon="-16.581019000">
+  <ele>232.000000</ele>
+  <time>2012-01-04T00:01:29Z</time>
+</trkpt>
+<trkpt lat="28.389900000" lon="-16.581051000">
+  <ele>234.000000</ele>
+  <time>2012-01-04T00:02:06Z</time>
+</trkpt>
+<trkpt lat="28.389909000" lon="-16.581191000">
+  <ele>233.000000</ele>
+  <time>2012-01-04T00:02:22Z</time>
+</trkpt>
+<trkpt lat="28.389890000" lon="-16.581309000">
+  <ele>233.000000</ele>
+  <time>2012-01-04T00:02:37Z</time>
+</trkpt>
+<trkpt lat="28.389871000" lon="-16.581438000">
+  <ele>233.000000</ele>
+  <time>2012-01-04T00:02:52Z</time>
+</trkpt>
+<trkpt lat="28.389881000" lon="-16.581663000">
+  <ele>230.000000</ele>
+  <time>2012-01-04T00:03:18Z</time>
+</trkpt>
+<trkpt lat="28.389852000" lon="-16.581813000">
+  <ele>228.000000</ele>
+  <time>2012-01-04T00:03:36Z</time>
+</trkpt>
+<trkpt lat="28.389815000" lon="-16.581985000">
+  <ele>224.000000</ele>
+  <time>2012-01-04T00:03:57Z</time>
+</trkpt>
+<trkpt lat="28.389834000" lon="-16.582156000">
+  <ele>224.000000</ele>
+  <time>2012-01-04T00:04:18Z</time>
+</trkpt>
+<trkpt lat="28.389768000" lon="-16.582199000">
+  <ele>226.000000</ele>
+  <time>2012-01-04T00:04:52Z</time>
+</trkpt>
+<trkpt lat="28.389777000" lon="-16.582049000">
+  <ele>225.000000</ele>
+  <time>2012-01-04T00:05:09Z</time>
+</trkpt>
+</trkseg>
+</trk>
+</gpx>
diff --git a/gpsbabel/reference/track/gtrnctr-readcp.tcx b/gpsbabel/reference/track/gtrnctr-readcp.tcx
new file mode 100644 (file)
index 0000000..f09771c
--- /dev/null
@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">\r
+  <Folders>\r
+    <Courses>\r
+      <CourseFolder Name="Courses">\r
+        <CourseNameRef>\r
+          <Id>Test CP Reading</Id>\r
+        </CourseNameRef>\r
+      </CourseFolder>\r
+    </Courses>\r
+  </Folders>\r
+  <Courses>\r
+    <Course>\r
+      <Name>Test CP Reading</Name>\r
+      <Lap>\r
+        <TotalTimeSeconds>309.9</TotalTimeSeconds>\r
+        <DistanceMeters>207.872342345229</DistanceMeters>\r
+        <BeginPosition>\r
+          <LatitudeDegrees>28.3899562951997</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.5815234184265</LongitudeDegrees>\r
+        </BeginPosition>\r
+        <EndPosition>\r
+          <LatitudeDegrees>28.3897769635538</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.5820491313934</LongitudeDegrees>\r
+        </EndPosition>\r
+        <Intensity>Active</Intensity>\r
+      </Lap>\r
+      <Track>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:00:00Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389956</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581523</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>231</AltitudeMeters>\r
+          <DistanceMeters>0</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:00:04Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389950</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581551</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>231</AltitudeMeters>\r
+          <DistanceMeters>2.78552429082476</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:00:14Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389900</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581539</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>231</AltitudeMeters>\r
+          <DistanceMeters>8.46401259709588</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:00:42Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389919</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581369</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>232</AltitudeMeters>\r
+          <DistanceMeters>25.2160839556801</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:00:57Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.390003</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581287</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>232</AltitudeMeters>\r
+          <DistanceMeters>37.536598150474</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:01:07Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389985</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581202</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>232</AltitudeMeters>\r
+          <DistanceMeters>46.1852716217043</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:01:19Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.390003</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581105</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>232</AltitudeMeters>\r
+          <DistanceMeters>55.8547825200545</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:01:29Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389994</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581019</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>232</AltitudeMeters>\r
+          <DistanceMeters>64.3105241299902</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:02:06Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389900</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581051</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>234</AltitudeMeters>\r
+          <DistanceMeters>75.26038211514</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:02:22Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389909</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581191</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>233</AltitudeMeters>\r
+          <DistanceMeters>88.9351471352528</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:02:37Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389890</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581309</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>233</AltitudeMeters>\r
+          <DistanceMeters>100.661161922849</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:02:52Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389871</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581438</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>233</AltitudeMeters>\r
+          <DistanceMeters>113.420447740461</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:03:18Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389881</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581663</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>230</AltitudeMeters>\r
+          <DistanceMeters>135.470349678032</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:03:36Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389852</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581813</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>228</AltitudeMeters>\r
+          <DistanceMeters>150.486980256282</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:03:57Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389815</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.581985</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>224</AltitudeMeters>\r
+          <DistanceMeters>167.78435337889</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:04:18Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389834</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.582156</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>224</AltitudeMeters>\r
+          <DistanceMeters>184.695864453439</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:04:52Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389768</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.582199</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>226</AltitudeMeters>\r
+          <DistanceMeters>193.151621872271</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+        <Trackpoint>\r
+          <Time>2012-01-04T00:05:09Z</Time>\r
+          <Position>\r
+            <LatitudeDegrees>28.389777</LatitudeDegrees>\r
+            <LongitudeDegrees>-16.582049</LongitudeDegrees>\r
+          </Position>\r
+          <AltitudeMeters>225</AltitudeMeters>\r
+          <DistanceMeters>207.872342345229</DistanceMeters>\r
+          <SensorState>Absent</SensorState>\r
+        </Trackpoint>\r
+      </Track>\r
+      <CoursePoint>\r
+        <Name>Tp Gen</Name>\r
+        <Time>2012-01-04T00:00:00Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389956</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581523</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>231</AltitudeMeters>\r
+        <PointType>Generic</PointType>\r
+        <Notes>Not Gen</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Sum</Name>\r
+        <Time>2012-01-04T00:00:42Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389919</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581369</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>232</AltitudeMeters>\r
+        <PointType>Summit</PointType>\r
+        <Notes>Not Sum</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Val</Name>\r
+        <Time>2012-01-04T00:00:57Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.390003</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581287</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>232</AltitudeMeters>\r
+        <PointType>Valley</PointType>\r
+        <Notes>Not Val</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Wat</Name>\r
+        <Time>2012-01-04T00:01:07Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389985</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581202</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>232</AltitudeMeters>\r
+        <PointType>Water</PointType>\r
+        <Notes>Not Wat</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Foo</Name>\r
+        <Time>2012-01-04T00:01:19Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.390003</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581105</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>232</AltitudeMeters>\r
+        <PointType>Food</PointType>\r
+        <Notes>Not Foo</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Dan</Name>\r
+        <Time>2012-01-04T00:01:29Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389994</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581019</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>232</AltitudeMeters>\r
+        <PointType>Danger</PointType>\r
+        <Notes>Not Dan</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Lef</Name>\r
+        <Time>2012-01-04T00:02:06Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389900</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581051</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>234</AltitudeMeters>\r
+        <PointType>Left</PointType>\r
+        <Notes>Not Lef</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Rig</Name>\r
+        <Time>2012-01-04T00:02:22Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389909</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581191</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>233</AltitudeMeters>\r
+        <PointType>Right</PointType>\r
+        <Notes>Not Rig</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Str</Name>\r
+        <Time>2012-01-04T00:02:37Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389890</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581309</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>233</AltitudeMeters>\r
+        <PointType>Straight</PointType>\r
+        <Notes>Not Str</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Fir</Name>\r
+        <Time>2012-01-04T00:02:52Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389871</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581438</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>233</AltitudeMeters>\r
+        <PointType>First Aid</PointType>\r
+        <Notes>Not Fir</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp 4th</Name>\r
+        <Time>2012-01-04T00:03:18Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389881</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581663</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>230</AltitudeMeters>\r
+        <PointType>4th Category</PointType>\r
+        <Notes>Not 4th</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp 3th</Name>\r
+        <Time>2012-01-04T00:03:36Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389852</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581813</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>228</AltitudeMeters>\r
+        <PointType>3rd Category</PointType>\r
+        <Notes>Not 3rd</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp 2nd</Name>\r
+        <Time>2012-01-04T00:03:57Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389815</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.581985</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>224</AltitudeMeters>\r
+        <PointType>2nd Category</PointType>\r
+        <Notes>Not 2nd</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp 1st</Name>\r
+        <Time>2012-01-04T00:04:18Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389834</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.582156</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>224</AltitudeMeters>\r
+        <PointType>1st Category</PointType>\r
+        <Notes>Not 1st</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Hor</Name>\r
+        <Time>2012-01-04T00:04:52Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389768</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.582199</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>226</AltitudeMeters>\r
+        <PointType>Hors Category</PointType>\r
+        <Notes>Not Hor</Notes>\r
+      </CoursePoint>\r
+      <CoursePoint>\r
+        <Name>Tp Spr</Name>\r
+        <Time>2012-01-04T00:05:09Z</Time>\r
+        <Position>\r
+          <LatitudeDegrees>28.389777</LatitudeDegrees>\r
+          <LongitudeDegrees>-16.582049</LongitudeDegrees>\r
+        </Position>\r
+        <AltitudeMeters>225</AltitudeMeters>\r
+        <PointType>Sprint</PointType>\r
+        <Notes>Not Spr</Notes>\r
+      </CoursePoint>\r
+    </Course>\r
+  </Courses>\r
+</TrainingCenterDatabase>\r
index abeaa070b27032aa25af862c8a0f8082483bbf23..a85b1e2b27d05c026c1cebc133f50ad4948c3225 100755 (executable)
@@ -230,26 +230,6 @@ rm -f ${TMPDIR}/itracku.unicsv
 gpsbabel -w -i itracku-bin -f ${REFERENCE}/itracku.dat -o unicsv,utc=0 -F ${TMPDIR}/itracku.unicsv
 compare ${REFERENCE}/itracku.unicsv ${TMPDIR}/itracku.unicsv
 
-#
-# Garmin Tranining Center .tcx (gtrnctr)
-#
-# reading
-rm -f ${TMPDIR}/history~tcx.csv ${TMPDIR}/course~tcx.csv
-gpsbabel -i gtrnctr -f ${REFERENCE}/track/history.tcx -t -o unicsv,utc=0 -F ${TMPDIR}/history~tcx.csv
-compare ${REFERENCE}/track/history~tcx.csv ${TMPDIR}/history~tcx.csv
-gpsbabel -i gtrnctr -f ${REFERENCE}/track/history.tcx -t -o gpx -F ${TMPDIR}/history~tcx.gpx
-compare ${REFERENCE}/track/history~tcx.gpx ${TMPDIR}/history~tcx.gpx
-gpsbabel -i gtrnctr -f ${REFERENCE}/track/course.tcx -t -o unicsv,utc=0 -F ${TMPDIR}/course~tcx.csv
-compare ${REFERENCE}/track/course~tcx.csv ${TMPDIR}/course~tcx.csv
-gpsbabel -i gtrnctr -f ${REFERENCE}/track/course.tcx -t -o gpx -F ${TMPDIR}/course~tcx.gpx
-compare ${REFERENCE}/track/course~tcx.gpx ${TMPDIR}/course~tcx.gpx
-# writing
-rm -f ${TMPDIR}tcxtest~gpx-course.tcx ${TMPDIR}tcxtest~gpx-history.tcx
-gpsbabel -i gpx -f ${REFERENCE}/track/tcxtest.gpx -o gtrnctr,course=1 -F ${TMPDIR}/tcxtest~gpx-course.tcx
-compare ${REFERENCE}/track/tcxtest~gpx-course.tcx ${TMPDIR}/tcxtest~gpx-course.tcx
-gpsbabel -i gpx -f ${REFERENCE}/track/tcxtest.gpx -o gtrnctr,course=0 -F ${TMPDIR}/tcxtest~gpx-history.tcx
-compare ${REFERENCE}/track/tcxtest~gpx-history.tcx ${TMPDIR}/tcxtest~gpx-history.tcx
-
 #
 # Memory-Map Navigator overlay files (.mmo)
 #
diff --git a/gpsbabel/testo.d/gtrnctr.test b/gpsbabel/testo.d/gtrnctr.test
new file mode 100644 (file)
index 0000000..082f722
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# Garmin Tranining Center .tcx (gtrnctr)
+#
+# reading
+rm -f ${TMPDIR}/history~tcx.csv ${TMPDIR}/course~tcx.csv
+gpsbabel -i gtrnctr -f ${REFERENCE}/track/history.tcx -t -o unicsv,utc=0 -F ${TMPDIR}/history~tcx.csv
+compare ${REFERENCE}/track/history~tcx.csv ${TMPDIR}/history~tcx.csv
+gpsbabel -i gtrnctr -f ${REFERENCE}/track/history.tcx -t -o gpx -F ${TMPDIR}/history~tcx.gpx
+compare ${REFERENCE}/track/history~tcx.gpx ${TMPDIR}/history~tcx.gpx
+gpsbabel -i gtrnctr -f ${REFERENCE}/track/course.tcx -t -o unicsv,utc=0 -F ${TMPDIR}/course~tcx.csv
+compare ${REFERENCE}/track/course~tcx.csv ${TMPDIR}/course~tcx.csv
+gpsbabel -i gtrnctr -f ${REFERENCE}/track/course.tcx -t -o gpx -F ${TMPDIR}/course~tcx.gpx
+compare ${REFERENCE}/track/course~tcx.gpx ${TMPDIR}/course~tcx.gpx
+# writing
+rm -f ${TMPDIR}tcxtest~gpx-course.tcx ${TMPDIR}tcxtest~gpx-history.tcx
+gpsbabel -i gpx -f ${REFERENCE}/track/tcxtest.gpx -o gtrnctr,course=1 -F ${TMPDIR}/tcxtest~gpx-course.tcx
+compare ${REFERENCE}/track/tcxtest~gpx-course.tcx ${TMPDIR}/tcxtest~gpx-course.tcx
+gpsbabel -i gpx -f ${REFERENCE}/track/tcxtest.gpx -o gtrnctr,course=0 -F ${TMPDIR}/tcxtest~gpx-history.tcx
+compare ${REFERENCE}/track/tcxtest~gpx-history.tcx ${TMPDIR}/tcxtest~gpx-history.tcx
+
+# Reading coursepoints
+gpsbabel -i gtrnctr -f ${REFERENCE}/track/gtrnctr-readcp.tcx -o gpx -F ${TMPDIR}/tcxtest-readcp.gpx
+compare ${REFERENCE}/track/gtrnctr-readcp.gpx  ${TMPDIR}/tcxtest-readcp.gpx